
package GUI;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 */


import Interaction.ServerConnection;
import Flightadministration.Flightadministration;
import Data.*;
import java.rmi.RemoteException;
//import java.text.DateFormat;
import java.util.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
// Quelle: http://nachocalendar.sourceforge.net/
import net.sf.nachocalendar.CalendarFactory;
import net.sf.nachocalendar.components.DateField;
import javax.swing.DefaultComboBoxModel;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;



public class FlightRealizationCreate extends JPanel {

    final Main td;
    private JPanel jp;
    Date d = new Date();
    private Date baseDate;
    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
    *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();
    public JComboBox comboBox1;
    public DefaultComboBoxModel model1;
    public Vector<String> allAircraftNames = new Vector<String>();
    public Vector<Airline> allAirlines;
    public Vector<Aircraft> allAvailableAircrafts;
    // Label für FlightId
    public JLabel label3;
    // Label für timeOfDeparture
    public JLabel label5;
    // Label für timeOfArrival
    public JLabel label7;
    // Label für departureAirport
    public JLabel label9;
    // Label für arrivalAirport
    public JLabel label11;
    // Label für airline
    public JLabel label13;
    // Label für weekday
    public JLabel label15;
    

    // Konstruktor
    public FlightRealizationCreate(final Main td) throws java.rmi.RemoteException {

        this.td = td;
        showFlightRealizationCreate();
    }


    // Methoden
    public void showFlightRealizationCreate() throws RemoteException {

        jp = new JPanel();
        
        //GridBagLayout
        //**********************************************************************

        GridBagLayout gbl = new GridBagLayout();
        jp.setLayout(gbl);
        jp.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Label
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Anlegen einer Flugdurchführung</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 4;
        jp.add(headline, constraints);

        JLabel subheadline = new JLabel("<html><p style=\"color:grey; text-align:center; line-height:1\">Bitte wählen Sie ein Abflug- sowie " + 
                                        " ein Ankunftsdatum aus und lassen sich daraufhin alle zu diesem Zeitpunkt<br>verfügbaren Flugzeuge " +
                                        " anzeigen. Aus diesen wählen Sie dann das Flugzeug aus, mit dem der Flug durchgeführt werden soll</p>" +
                                        "</html>");
        subheadline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 4;
        jp.add(subheadline, constraints);


        JLabel label2 = new JLabel("Flugnummer: ");
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        jp.add(label2, constraints);

        label3 = new JLabel();
        constraints.gridx = 1;
        constraints.gridy = 2;
        jp.add(label3, constraints);


        JLabel label12 = new JLabel("Fluglinie: ");
        constraints.gridx = 2;
        constraints.gridy = 2;
        jp.add(label12, constraints);

        label13 = new JLabel();
        constraints.gridx = 3;
        constraints.gridy = 2;
        jp.add(label13, constraints);


        JLabel label4 = new JLabel("Abflugzeit: ");
        constraints.gridx = 0;
        constraints.gridy = 3;
        jp.add(label4, constraints);

        label5 = new JLabel();
        constraints.gridx = 1;
        constraints.gridy = 3;
        jp.add(label5, constraints);


        JLabel label6 = new JLabel("Ankunftzeit: ");
        constraints.gridx = 2;
        constraints.gridy = 3;
        jp.add(label6, constraints);

        label7 = new JLabel();
        constraints.gridx = 3;
        constraints.gridy = 3;
        jp.add(label7, constraints);


        JLabel label8 = new JLabel("Startflughafen: ");
        constraints.gridx = 0;
        constraints.gridy = 4;
        jp.add(label8, constraints);

        label9 = new JLabel();
        constraints.gridx = 1;
        constraints.gridy = 4;
        jp.add(label9, constraints);


        JLabel label10 = new JLabel("Zielflughafen: ");
        constraints.gridx = 2;
        constraints.gridy = 4;
        jp.add(label10, constraints);

        label11 = new JLabel();
        constraints.gridx = 3;
        constraints.gridy = 4;
        jp.add(label11, constraints);


        JLabel label14 = new JLabel("Abflugwochentag: ");
        constraints.gridx = 0;
        constraints.gridy = 5;
        jp.add(label14, constraints);

        label15 = new JLabel();
        constraints.gridx = 1;
        constraints.gridy = 5;
        jp.add(label15, constraints);

        JLabel label16 = new JLabel("Abflugdatum festlegen: ");
        constraints.gridx = 0;
        constraints.gridy = 6;
        jp.add(label16, constraints);

        final DateField datefield1 = CalendarFactory.createDateField();
        constraints.gridx = 1;
        constraints.gridy = 6;
        jp.add(datefield1, constraints);

        JLabel label17 = new JLabel("Ankunftsdatum festlegen: ");
        constraints.gridx = 2;
        constraints.gridy = 6;
        jp.add(label17, constraints);

        final DateField datefield2 = CalendarFactory.createDateField();
        constraints.gridx = 3;
        constraints.gridy = 6;
        jp.add(datefield2, constraints);

        final JLabel label18 = new JLabel("Flugzeug wählen: ");
        constraints.gridx = 0;
        constraints.gridy = 7;
        constraints.gridwidth = 1;
        label18.setVisible(false);
        jp.add(label18, constraints);

        comboBox1 = new JComboBox() ;
        constraints.gridx = 1;
        constraints.gridy = 7;
        constraints.gridwidth = 1;
        comboBox1.setVisible(false);
        jp.add(comboBox1, constraints);

        final JLabel label19 = new JLabel("<html><p style=\"color:red\">" + 
                                          "Leider sind zu diesem Zeitpunkt alle Flugzeuge in der Luft,<br>" +
                                          "bitte wählen Sie ein anderes Datum für Ihren Flug aus</p></html>");
        constraints.gridx = 0;
        constraints.gridy = 7;
        constraints.gridwidth = 2;
        label19.setVisible(false);
        jp.add(label19, constraints);


        //Buttons
        //**********************************************************************

        final JButton button_availableAircrafts = new JButton("Alle verfügbaren Flugzeuge anzeigen");
        constraints.gridx = 0;
        constraints.gridy = 7;
        constraints.gridwidth = 2;
        jp.add(button_availableAircrafts, constraints);

        JButton button_CreateFlightRealization = new JButton("Flugdurchführung anlegen");
        constraints.gridx = 0;
        constraints.gridy = 8;
        constraints.gridwidth = 2;
        jp.add(button_CreateFlightRealization, constraints);

        JButton button_Cancel = new JButton("Zurück zur Übersicht");
        constraints.gridx = 2;
        constraints.gridy = 8;
        constraints.gridwidth = 2;
        jp.add(button_Cancel, constraints);


        //Action Listener
        //**********************************************************************

        /**
         * ActionListener liest das Datum des Abfluges aus und
         * übernimmt dieses in das Datumsfeld für das Ankunftsdatum
         */
        datefield1.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
            public void propertyChange(PropertyChangeEvent evt) {
                // Datum des Abflugtermins auslesen und in Datumsfeld für Ankunft übernehmen
                Object chosenDate = datefield1.getValue();
                datefield2.setValue(chosenDate);
            }
        });

        /**
         * ActionListener macht Label und ComboBox unsichtbar und dafür Button sichtbar,
         * wenn der Nutzer ein neues Datum auswählt
         */
        datefield1.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
            public void propertyChange(PropertyChangeEvent evt) {
                comboBox1.setVisible(false);
                label18.setVisible(false);
                label19.setVisible(false);
                button_availableAircrafts.setVisible(true);
            }
        });

        /**
         * ActionListener macht Label und ComboBox unsichtbar und dafür Button sichtbar,
         * wenn der Nutzer ein neues Datum auswählt
         */
        datefield2.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
            public void propertyChange(PropertyChangeEvent evt) {
                comboBox1.setVisible(false);
                label18.setVisible(false);
                label19.setVisible(false);
                button_availableAircrafts.setVisible(true);
            }
        });

        /**
         * ActionListener macht bei einem Klick auf den Button diesen unsichtbar, und zeigt stattdessen
         * eine ComboBox in der ebenfalls über den ActionListener die aktuell verfügbaren Flugzeuge angezeigt werden
         */
        button_availableAircrafts.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){

                try {
                    // Vector mit allen Fluglinien aus der Datenbank befüllen
                    allAirlines = admin.getAllAirlinesForComboBox();
                    // Über nachfolgende for-Schleife die Id der betroffenen Fluglinie auslesen und in Integervariable speichern
                    int airlineId = 0;

                        for(int i = 0; i<allAirlines.size(); i++) {
                            if (allAirlines.get(i).getAirName().equals(label13.getText())) {
                                airlineId = allAirlines.get(i).getAirId();
                            }
                        }

                    // Start- und Enddatum der FlightRealization (Flugdurchführung) aus Kalender auslesen
                    Date dateOfDeparture = (Date) datefield1.getValue();
                    Date dateOfArrival = (Date) datefield2.getValue();

                    // Vector erzeugen in den alle zum ausgewählten Zeitpunkt verfügbaren Flugzeuge aus der Datenbank gespeichert werden
                    allAvailableAircrafts = admin.getAllAircraftsByAvailabilityForComboBox(dateOfDeparture, dateOfArrival, airlineId);

                    // Prüfen ob überhaupt Flugzeuge verfügbar sind
                    if(allAvailableAircrafts.size() == 0) {
                        button_availableAircrafts.setVisible(false);
                        label19.setVisible(true);
                    }
                    else {
                        // Button unsichtbar und Label und ComboBox sichtbar machen
                        button_availableAircrafts.setVisible(false);

                        // Wenn ja zunächst Vector komplett leeren
                        allAircraftNames.removeAllElements();
                        // Über die nachfolgende for-Schleife werden die Bezeichnungen aller Flugzeuge in den Vector gespeichert
                        for(int i = 0; i<allAvailableAircrafts.size(); i++) {
                            // Bezeichnung des aktuellen Flugzeuges auslesen und in Stringvariable speichern
                            String aircraftName = String.valueOf(allAvailableAircrafts.get(i).getCraftName());
                            // Bezeichnung des Flugzeugtyps des des entsprechenden Flugzeuges auslesen und in Stringvariable speichern
                            TypeOfAircraft tOA = admin.getTypeOfAircraftById(allAvailableAircrafts.get(i).getTypeOfAircraftId());
                            String tOAName = tOA.getCraftTypeName();
                            // Strings verbinden
                            String availableAircraftName = aircraftName + " (" + tOAName + ")";
                            // Stringvariable in Vector speichern
                            allAircraftNames.add(availableAircraftName);
                        }

                        // Neues Model erzeugen dem die Namen der verfügbaren Flugzeuge übergeben werden
                        model1 = new DefaultComboBoxModel(allAircraftNames);
                        
                        // Label und ComboBox sichtbar machen
                        label18.setVisible(true);
                        comboBox1.setModel(model1);
                        comboBox1.setVisible(true);
                    }
                } catch (RemoteException ex) {
                    System.out.println(ex);
                }
            }
        });


        button_CreateFlightRealization.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                Date da1 = (Date) datefield1.getValue();
                Date da2 = (Date) datefield2.getValue();

                 if (datefield1.getValue().equals("")) {
                    JOptionPane.showMessageDialog(null, "Bitte alle Felder ausfüllen!");
                 }
                 else if (da2.before(da1)){
                      JOptionPane.showMessageDialog(null, "Ankunftstag darf nicht vor dem Abflugtag liegen!");
                      }
                      else {
                            try {
                                // Abflugdatum aus datefield auslesen
                                Date departureDate = (Date) datefield1.getValue();
                                // Ankunftsdatum aus datefield auslesen
                                Date arrivalDate = (Date) datefield2.getValue();

                                // Flugnummer aus Label auslesen
                                Object currentFlightId = label3.getText();
                                    String currentFlightIdAsString = currentFlightId.toString();
                                        int currentFlightIdAsInt = Integer.parseInt(currentFlightIdAsString);

                                            // Objekt des aktuellen Fluges erzeugen
                                            Flight f = admin.getFlightById(currentFlightIdAsInt);


                                /* Array mit Wochentagen um den Wochentag des Abflugdatums (departureDate) zu ermitteln */
                                String[] weekdays = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};

                                    /* Dateobjekt mittels Abflugdatum (dateOfDeparture) erstellen und Wochentag als Integer auslesen */
                                    Date d = departureDate;
                                    int indexOfWeekday = d.getDay();

                                        /* Stringobjekt für den Abflugtag erzeugen indem der Wochentag des Integerwertes (indexOfWeekday)
                                         * aus dem Array mit den Wochentagen ausgelesen wird. */
                                        String dayOfDepartureFromArray = new String(weekdays[indexOfWeekday]);
                                        /* Stringobjekt für den Abflugtag erzeugen, in dem der Abflugtag der ausgewählten FlightId aus der Datenbank ausgelesen wird */
                                        String dayOfDepartureFromDB = f.getDayOfDeparture();

                                // Ausgewähltes Flugzeug aus ComboBox auslesen
                                String currentAircraftAsString = String.valueOf(comboBox1.getSelectedItem());
                                    int index1 = 0;
                                    int index2 = currentAircraftAsString.indexOf("(") - 1;
                                        String currentAircraftNameAsString = currentAircraftAsString.substring(index1, index2);

                                            int currentAircraftId = 0;
                                            // Vector mit allen Flugzeugen aus Datenbank befüllen
                                            Vector<Aircraft> allAircrafts = admin.getAllAircraftsForComboBox();
                                            // Mittels for-Schleife die Id des Flugzeuges auslesen und in die Variable 'currentAircraftId' speichern
                                            for(int i = 0; i<allAircrafts.size(); i++) {
                                                if(allAircrafts.get(i).getCraftName().equals(currentAircraftNameAsString)) {
                                                    currentAircraftId = allAircrafts.get(i).getCraftId();
                                                }
                                            }

                                /* Abfrage ob Wochentag des ausgewählten Startdatums des Fluges (FlightRealization)
                                 * sowie der Wochentag des Fluges (Flight) im Flugplan übereinstimmen. */
                                if(dayOfDepartureFromArray.equals(dayOfDepartureFromDB)) {

                                    // FlightRealization anlegen
                                    admin.createFlightRealization(departureDate, arrivalDate, currentFlightIdAsInt, currentAircraftId);
                                    
                                        // JTables aktualisieren
                                        td.updateFlightRealization();

                                    JOptionPane.showMessageDialog(null, "Flugdurchführung angelegt");

                                    /* Prüfen an welchem Wochentag der Flug durchgeführt wird, um nach dem Anlegen
                                     * auf die dementsprechende Übersichtsseits zu gelangen */
                                    if(label15.getText().equals("Montag")) {
                                        ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationMoM");
                                    }
                                    else if(label15.getText().equals("Dienstag")) {
                                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationDiM");
                                        }
                                        else if(label15.getText().equals("Mittwoch")) {
                                                ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationMiM");
                                            }
                                            else if(label15.getText().equals("Donnerstag")) {
                                                    ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationDoM");
                                                }
                                                else if(label15.getText().equals("Freitag")) {
                                                        ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationFrM");
                                                    }
                                                    else if(label15.getText().equals("Samstag")) {
                                                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationSaM");
                                                        }
                                                        else {
                                                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationSoM");
                                                        }

                                    // Alle Labels und die ComboBox leeren
                                    label3.removeAll();
                                    label5.removeAll();
                                    label7.removeAll();
                                    label9.removeAll();
                                    label11.removeAll();
                                    label13.removeAll();
                                    label15.removeAll();
                                    allAircraftNames.removeAllElements();

                                }
                                else {
                                    JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                        "Leider konnte keine Flugdurchführung angelegt werden.<br>" +
                                                                        "Bitte wählen Sie ein Datum an einem " + dayOfDepartureFromDB + " aus.</p></html>");
                                }
                            } catch (NullPointerException ex) {
                                JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                        "Sie müssen zunächst alle notwendigen Informationen<br>" +
                                                                        "zu dieser Flugdurchführung angeben!</p></html>");
                            } catch (RemoteException ex) {
                                System.out.println(ex);
                            }
                      }
            }
        });


        button_Cancel.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){

                    if(label15.getText().equals("Montag")) {
                        ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationMoM");
                    }
                    else if(label15.getText().equals("Dienstag")) {
                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationDiM");
                        }
                        else if(label15.getText().equals("Mittwoch")) {
                                ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationMiM");
                            }
                            else if(label15.getText().equals("Donnerstag")) {
                                    ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationDoM");
                                }
                                else if(label15.getText().equals("Freitag")) {
                                        ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationFrM");
                                    }
                                    else if(label15.getText().equals("Samstag")) {
                                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationSaM");
                                        }
                                        else {
                                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationSoM");
                                        }
                
            }
        });
    }
    

    public JPanel getJp() {
        return jp;
    }
}

